home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / linux-bo / rampatch.z / rampatch
Text File  |  1993-09-30  |  17KB  |  629 lines

  1. diff -rc2 ./Makefile /usr/src/linux/Makefile
  2. *** ./Makefile    Thu Aug  5 11:59:18 1993
  3. --- /usr/src/linux/Makefile    Thu Sep 30 10:44:29 1993
  4. ***************
  5. *** 163,166 ****
  6. --- 163,169 ----
  7.       sync
  8.   
  9. + zNetBoot: $(CONFIGURE) boot/bootsect boot/setup zBoot/zSystem tools/build
  10. +     tools/build -n tools/zSystem \? boot/bootsect boot/setup zBoot/zSystem > zNetBoot
  11.   zdisk: zImage
  12.       dd bs=8192 if=zImage of=/dev/fd0
  13. diff -rc2 ./boot/bootsect.S /usr/src/linux/boot/bootsect.S
  14. *** ./boot/bootsect.S    Tue Apr  6 20:57:20 1993
  15. --- /usr/src/linux/boot/bootsect.S    Thu Sep  9 07:41:23 1993
  16. ***************
  17. *** 46,49 ****
  18. --- 46,52 ----
  19.   #define RAMDISK 0
  20.   #endif 
  21. + #ifndef RAMDISK_START
  22. + #define RAMDISK_START 0        /* for net boot 1024, for zBoot + net boot -> after &end */
  23. + #endif 
  24.   #ifndef CONFIG_ROOT_RDONLY
  25.   #define CONFIG_ROOT_RDONLY 0
  26. ***************
  27. *** 433,437 ****
  28.       .ascii "Loading"
  29.   
  30. ! .org 498
  31.   root_flags:
  32.       .word CONFIG_ROOT_RDONLY
  33. --- 436,442 ----
  34.       .ascii "Loading"
  35.   
  36. ! .org 496
  37. ! ramdsk_start:
  38. !     .word RAMDISK_START
  39.   root_flags:
  40.       .word CONFIG_ROOT_RDONLY
  41. diff -rc2 ./boot/setup.S /usr/src/linux/boot/setup.S
  42. *** ./boot/setup.S    Thu May 13 12:19:57 1993
  43. --- /usr/src/linux/boot/setup.S    Thu Sep 30 10:10:27 1993
  44. ***************
  45. *** 49,52 ****
  46. --- 49,60 ----
  47.       mov    ds,ax
  48.   
  49. +     mov    dx,#0x4000-12    ! 0x4000 is arbitrary value >= length of
  50. + ! we've done all this before in bootsect, but not if we netbooted!
  51. +     mov    es,ax
  52. +     mov    ss,ax        ! put stack at INITSEG:0x4000-12.
  53. +     mov    sp,dx
  54.   ! Get memory size (extended mem, kB)
  55.   
  56. diff -rc2 ./init/main.c /usr/src/linux/init/main.c
  57. *** ./init/main.c    Mon Aug  9 18:02:31 1993
  58. --- /usr/src/linux/init/main.c    Thu Sep  9 08:16:18 1993
  59. ***************
  60. *** 95,98 ****
  61. --- 95,99 ----
  62.   #define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
  63.   #define SCREEN_INFO (*(struct screen_info *) (PARAM+0))
  64. + #define RAMDISK_START (*(unsigned short *)(PARAM+0x1F0))
  65.   #define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
  66.   #define RAMDISK_SIZE (*(unsigned short *) (PARAM+0x1F8))
  67. ***************
  68. *** 166,169 ****
  69. --- 167,171 ----
  70.   unsigned char aux_device_present;
  71.   int ramdisk_size;
  72. + int ramdisk_start;    /* if set, then assumed that ramdisk already loaded */
  73.   int root_mountflags = 0;
  74.   
  75. ***************
  76. *** 344,347 ****
  77. --- 346,350 ----
  78.       memory_end &= PAGE_MASK;
  79.       ramdisk_size = RAMDISK_SIZE;
  80. +     ramdisk_start = RAMDISK_START;
  81.       strcpy(command_line,COMMAND_LINE);
  82.   #ifdef CONFIG_MAX_16M
  83. ***************
  84. *** 351,360 ****
  85.       if (MOUNT_ROOT_RDONLY)
  86.           root_mountflags |= MS_RDONLY;
  87. !     if ((unsigned long)&end >= (1024*1024)) {
  88. !         memory_start = (unsigned long) &end;
  89. !         low_memory_start = PAGE_SIZE;
  90. !     } else {
  91. !         memory_start = 1024*1024;
  92. !         low_memory_start = (unsigned long) &end;
  93.       }
  94.       low_memory_start = PAGE_ALIGN(low_memory_start);
  95. --- 354,378 ----
  96.       if (MOUNT_ROOT_RDONLY)
  97.           root_mountflags |= MS_RDONLY;
  98. !      if (ramdisk_start) {
  99. !          if ((unsigned long)&end >= (1024*1024)) {
  100. !              /* using zBoot */
  101. !              if (ramdisk_start * 1024 < ((unsigned long)&end)) {
  102. !                  printk("Ramdisk at incompatible location with kernel\n");
  103. !                  /* what should I do here ? */
  104. !              }
  105. !              low_memory_start = PAGE_SIZE;
  106. !          } else {
  107. !              low_memory_start = (unsigned long) &end;
  108. !          }
  109. !          memory_start = ramdisk_start * 1024 + ramdisk_size *  1024;
  110. !       } else {
  111. !          if ((unsigned long)&end >= (1024*1024)) {
  112. !              memory_start = (unsigned long) &end;
  113. !              low_memory_start = PAGE_SIZE;
  114. !          } else {
  115. !              memory_start = 1024*1024;
  116. !              low_memory_start = (unsigned long) &end;
  117. !          }
  118.       }
  119.       low_memory_start = PAGE_ALIGN(low_memory_start);
  120. diff -rc2 ./kernel/blk_drv/blk.h /usr/src/linux/kernel/blk_drv/blk.h
  121. *** ./kernel/blk_drv/blk.h    Sat Aug 14 23:47:22 1993
  122. --- /usr/src/linux/kernel/blk_drv/blk.h    Thu Sep  9 07:41:23 1993
  123. ***************
  124. *** 86,91 ****
  125.   
  126.   extern void rd_load(void);
  127. ! extern long rd_init(long mem_start, int length);
  128.   extern int ramdisk_size;
  129.   
  130.   extern unsigned long xd_init(unsigned long mem_start, unsigned long mem_end);
  131. --- 86,92 ----
  132.   
  133.   extern void rd_load(void);
  134. ! extern long rd_init(long mem_start, int length, int preload);
  135.   extern int ramdisk_size;
  136. + extern int ramdisk_start;
  137.   
  138.   extern unsigned long xd_init(unsigned long mem_start, unsigned long mem_end);
  139. diff -rc2 ./kernel/blk_drv/ll_rw_blk.c /usr/src/linux/kernel/blk_drv/ll_rw_blk.c
  140. *** ./kernel/blk_drv/ll_rw_blk.c    Sat Aug 14 23:47:22 1993
  141. --- /usr/src/linux/kernel/blk_drv/ll_rw_blk.c    Thu Sep  9 07:41:24 1993
  142. ***************
  143. *** 438,443 ****
  144.       mem_start = mcd_init(mem_start,mem_end);
  145.   #endif
  146. !     if (ramdisk_size)
  147. !         mem_start += rd_init(mem_start, ramdisk_size*1024);
  148.       return mem_start;
  149.   }
  150. --- 438,447 ----
  151.       mem_start = mcd_init(mem_start,mem_end);
  152.   #endif
  153. !     if (ramdisk_size) {
  154. !         if (ramdisk_start)
  155. !             rd_init(ramdisk_start*1024, ramdisk_size*1024, 1);
  156. !         else
  157. !             mem_start += rd_init(mem_start, ramdisk_size*1024, 0);
  158. !     }
  159.       return mem_start;
  160.   }
  161. diff -rc2 ./kernel/blk_drv/ramdisk.c /usr/src/linux/kernel/blk_drv/ramdisk.c
  162. *** ./kernel/blk_drv/ramdisk.c    Wed Aug  4 22:38:40 1993
  163. --- /usr/src/linux/kernel/blk_drv/ramdisk.c    Thu Sep  9 07:56:20 1993
  164. ***************
  165. *** 28,31 ****
  166. --- 28,33 ----
  167.   char    *rd_start;
  168.   int    rd_length = 0;
  169. + int    rd_isloaded = 0;
  170.   static int rd_blocksizes[2] = {0, 0};
  171.   
  172. ***************
  173. *** 74,78 ****
  174.    * Returns amount of memory which needs to be reserved.
  175.    */
  176. ! long rd_init(long mem_start, int length)
  177.   {
  178.       int    i;
  179. --- 76,80 ----
  180.    * Returns amount of memory which needs to be reserved.
  181.    */
  182. ! long rd_init(long mem_start, int length, int preload)
  183.   {
  184.       int    i;
  185. ***************
  186. *** 88,92 ****
  187.       cp = rd_start;
  188.       for (i=0; i < length; i++)
  189. !         *cp++ = '\0';
  190.   
  191.       for(i=0;i<2;i++) rd_blocksizes[i] = 1024;
  192. --- 90,98 ----
  193.       cp = rd_start;
  194.       for (i=0; i < length; i++)
  195. !      rd_isloaded = preload;
  196. !      if (!preload) {
  197. !          for (i=0; i < length; i++)
  198. !              *cp++ = '\0';
  199. !      }
  200.   
  201.       for(i=0;i<2;i++) rd_blocksizes[i] = 1024;
  202. ***************
  203. *** 115,118 ****
  204. --- 121,129 ----
  205.                       rd_length, (int) rd_start);
  206.   
  207. +     if (rd_isloaded) {
  208. +         if (ROOT_DEV != ((MAJOR_RAMDISK << 8) | MINOR_RAMDISK))
  209. +             printk("Root device not set to ramdisk\n");
  210. +         return;
  211. +     }
  212.       /* If we are doing a diskette boot, we might have to pre-load it. */
  213.       if (MAJOR(ROOT_DEV) != MAJOR_FLOPPY) return;
  214. ***************
  215. *** 177,178 ****
  216. --- 188,190 ----
  217.       }
  218.   }
  219. diff -rc2 ./tools/build.c /usr/src/linux/tools/build.c
  220. *** ./tools/build.c    Sun May 30 13:53:36 1993
  221. --- /usr/src/linux/tools/build.c    Thu Sep 30 10:27:30 1993
  222. ***************
  223. *** 19,22 ****
  224. --- 19,23 ----
  225.   /*
  226.    * Changes by tytso to allow root device specification
  227. +  * 25 Sep 1993 jwh - changes for network boot stuff
  228.    */
  229.   
  230. ***************
  231. *** 32,35 ****
  232. --- 33,39 ----
  233.   #include <linux/a.out.h>
  234.   
  235. + #define MAJOR_RAMDISK    1        /* should be in <linux/major.h>    */
  236. + #define MINOR_RAMDISK    1
  237.   #define MINIX_HEADER 32
  238.   #define GCC_HEADER 1024
  239. ***************
  240. *** 37,40 ****
  241. --- 41,52 ----
  242.   #define SYS_SIZE DEF_SYSSIZE
  243.   
  244. + #define DEF_RAMSTART 0x100000
  245. + #define SYS_SIZE DEF_SYSSIZE
  246. + #define INITSEG  DEF_INITSEG
  247. + #define SYSSEG   DEF_SYSSEG
  248. + #define SETUPSEG DEF_SETUPSEG
  249. + #define RAMPTR   DEF_RAMSTART
  250.   #define DEFAULT_MAJOR_ROOT 0
  251.   #define DEFAULT_MINOR_ROOT 0
  252. ***************
  253. *** 46,49 ****
  254. --- 58,96 ----
  255.   #define STRINGIFY(x) #x
  256.   
  257. + typedef struct load_record
  258. + {
  259. +     unsigned long    rlength;
  260. +     unsigned long    address;
  261. +     unsigned long    ilength;
  262. +     unsigned long    mlength;
  263. + }  LOAD_RECORD;
  264. + #define FLAG_EOF    0x04000000
  265. + typedef struct load_header
  266. + {
  267. +     unsigned long    magic;
  268. +     unsigned long    hlengthflags;
  269. +     unsigned long    locn;
  270. +     unsigned long    execute;
  271. +     LOAD_RECORD    lr_setup;
  272. +     LOAD_RECORD    lr_kernel;
  273. +     LOAD_RECORD    lr_ramdisk;
  274. +     char        dummy[496 - 64]; /* bring us up to 496 */
  275. +     unsigned short    ramdsk_start;        /* start of ramdisk / 1024 */
  276. +     unsigned short    root_flags;
  277. +     unsigned short    syssize;        /* SYSSIZE  / 16 */
  278. +     unsigned short    swap_dev;         /* SWAP_DEV */
  279. +     unsigned short    ram_size;         /* RAMDISK in K */
  280. +     unsigned short    vid_mode;         /* SVGA_MODE */
  281. +     unsigned char    root_dev_minor;        /* ROOT_DEV */
  282. +     unsigned char    root_dev_major;        /* ROOT_DEV */
  283. +     unsigned short    boot_flag;         /* 0xAA55 */
  284. + } LOAD_HEADER;
  285. + #define LENGTH_FIELD    4
  286. + LOAD_HEADER lh;
  287.   typedef union {
  288.       long l;
  289. ***************
  290. *** 72,75 ****
  291. --- 119,130 ----
  292.   }
  293.   
  294. + short unintel_short(short l)
  295. + {
  296. +     conv t;
  297. +     t.s[0] = l;
  298. +     return (t.b[0] + (t.b[1] << 8));
  299. + }
  300.   void die(char * str)
  301.   {
  302. ***************
  303. *** 80,84 ****
  304.   void usage(void)
  305.   {
  306. !     die("Usage: build bootsect setup system [rootdev] [> image]");
  307.   }
  308.   
  309. --- 135,139 ----
  310.   void usage(void)
  311.   {
  312. !     die("Usage: build [-n uncompressed-image ramdisk] bootsect setup system [rootdev] [>image]");
  313.   }
  314.   
  315. ***************
  316. *** 92,99 ****
  317.       struct stat sb;
  318.   
  319. !     if ((argc < 4) || (argc > 5))
  320. !         usage();
  321. !     if (argc > 4) {
  322. !         if (!strcmp(argv[4], "CURRENT")) {
  323.               if (stat("/", &sb)) {
  324.                   perror("/");
  325. --- 147,232 ----
  326.       struct stat sb;
  327.   
  328. !     unsigned long ramsize;
  329. !     unsigned long ramstart;
  330. !     unsigned long iramsize;
  331. !     unsigned long total_length;
  332. !     unsigned long fluffed_length;
  333. !     int     is_netBoot;
  334. !     char    *argp;
  335. !     int    argn;
  336. !     char    *unc_image_name;/* name of uncompressed image file */
  337. !     char    *ram_name;    /* name or ramdisk file */
  338. !     char    *bootsect_name;
  339. !     char    *setup_name;
  340. !     char    *zImage_name;
  341. !     char    *root_dev_name;
  342. !     char    name_of_ramdisk[128];
  343. !     if (sizeof(LOAD_HEADER) != 512)
  344. !         die("Bad build, load header size");
  345. !     unc_image_name = 
  346. !     ram_name = 
  347. !     bootsect_name =
  348. !     setup_name =
  349. !     zImage_name =
  350. !     root_dev_name = (char *)NULL;
  351. !     is_netBoot = 0;
  352. !     for(argn = 1; argn < argc; argn++) {
  353. !         argp = argv[argn];
  354. !         if (*argp != '-') {
  355. !             if (is_netBoot) {
  356. !                 if (unc_image_name ==  NULL) {
  357. !                   unc_image_name = argp;
  358. !                   continue;
  359. !                     }
  360. !                 else
  361. !                 if (ram_name == NULL){
  362. !                     if (*argp == '?') {
  363. !                         fprintf(stderr, "Name of ramdisk :");
  364. !                         fgets(name_of_ramdisk, sizeof(name_of_ramdisk),stdin);
  365. !                         if ((argp = strchr(name_of_ramdisk, '\n')) != NULL)
  366. !                           *argp = '\0';
  367. !                         if (name_of_ramdisk[0] == '\0')
  368. !                           usage();
  369. !                         argp = name_of_ramdisk;
  370. !                     }
  371. !                   ram_name = argp;
  372. !                   continue;
  373. !                     }
  374. !             }
  375. !             if (bootsect_name == NULL)
  376. !               bootsect_name = argp;
  377. !             else if (setup_name == NULL)
  378. !                     setup_name =  argp;
  379. !             else if (zImage_name == NULL)
  380. !                     zImage_name = argp;
  381. !             else if (root_dev_name == NULL)
  382. !                     root_dev_name = argp;
  383. !             else {
  384. !                 usage();
  385. !             }
  386. !         }
  387. !         else {
  388. !             switch(*++argp) {
  389. !             case 'n':
  390. !                 is_netBoot = 1;
  391. !                 break;
  392. !             default:
  393. !                 usage();
  394. !                 break;
  395. !             }
  396. !         }
  397. !     }
  398. !     if ((is_netBoot) && ((unc_image_name ==  NULL) || (ram_name == NULL)))
  399. !       usage();
  400. !     if ((bootsect_name == NULL) || (setup_name == NULL) ||
  401. !         (zImage_name == NULL))
  402. !       usage();
  403. !     if (root_dev_name) {
  404. !         if (!strcmp(root_dev_name, "CURRENT")) {
  405.               if (stat("/", &sb)) {
  406.                   perror("/");
  407. ***************
  408. *** 102,108 ****
  409.               major_root = major(sb.st_dev);
  410.               minor_root = minor(sb.st_dev);
  411. !         } else if (strcmp(argv[4], "FLOPPY")) {
  412. !             if (stat(argv[4], &sb)) {
  413. !                 perror(argv[4]);
  414.                   die("Couldn't stat root device.");
  415.               }
  416. --- 235,241 ----
  417.               major_root = major(sb.st_dev);
  418.               minor_root = minor(sb.st_dev);
  419. !         } else if (strcmp(root_dev_name, "FLOPPY")) {
  420. !             if (stat(root_dev_name, &sb)) {
  421. !                 perror(root_dev_name);
  422.                   die("Couldn't stat root device.");
  423.               }
  424. ***************
  425. *** 114,123 ****
  426.           }
  427.       } else {
  428. !         major_root = DEFAULT_MAJOR_ROOT;
  429. !         minor_root = DEFAULT_MINOR_ROOT;
  430.       }
  431.       fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
  432.       for (i=0;i<sizeof buf; i++) buf[i]=0;
  433. !     if ((id=open(argv[1],O_RDONLY,0))<0)
  434.           die("Unable to open 'boot'");
  435.       if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
  436. --- 247,262 ----
  437.           }
  438.       } else {
  439. !         if (is_netBoot) {
  440. !             major_root = MAJOR_RAMDISK;
  441. !             minor_root = MINOR_RAMDISK;
  442. !         }
  443. !         else {
  444. !             major_root = DEFAULT_MAJOR_ROOT;
  445. !             minor_root = DEFAULT_MINOR_ROOT;
  446. !         }
  447.       }
  448.       fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
  449.       for (i=0;i<sizeof buf; i++) buf[i]=0;
  450. !     if ((id=open(bootsect_name,O_RDONLY,0))<0)
  451.           die("Unable to open 'boot'");
  452.       if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
  453. ***************
  454. *** 135,147 ****
  455.       if (((long *) buf)[7] != 0)
  456.           die("Illegal symbol table in 'boot'");
  457. !     i=read(id,buf,sizeof buf);
  458.       fprintf(stderr,"Boot sector %d bytes.\n",i);
  459.       if (i != 512)
  460.           die("Boot block must be exactly 512 bytes");
  461. !     if ((*(unsigned short *)(buf+510)) != (unsigned short)intel_short(0xAA55))
  462.           die("Boot block hasn't got boot flag (0xAA55)");
  463. !     buf[508] = (char) minor_root;
  464. !     buf[509] = (char) major_root;    
  465. !     i=write(1,buf,512);
  466.       if (i!=512)
  467.           die("Write call failed");
  468. --- 274,288 ----
  469.       if (((long *) buf)[7] != 0)
  470.           die("Illegal symbol table in 'boot'");
  471. !     i=read(id,&lh,sizeof buf);
  472.       fprintf(stderr,"Boot sector %d bytes.\n",i);
  473.       if (i != 512)
  474.           die("Boot block must be exactly 512 bytes");
  475. !     if (lh.boot_flag != (unsigned short)intel_short(0xAA55))
  476.           die("Boot block hasn't got boot flag (0xAA55)");
  477. !     if (lh.magic == (unsigned long)intel_long(0x1b031336))
  478. !         die("bottsect is already a net image\n");
  479. !     lh.root_dev_minor = (char) minor_root;
  480. !     lh.root_dev_major = (char) major_root;    
  481. !     i=write(1,&lh,512);
  482.       if (i!=512)
  483.           die("Write call failed");
  484. ***************
  485. *** 148,152 ****
  486.       close (id);
  487.       
  488. !     if ((id=open(argv[2],O_RDONLY,0))<0)
  489.           die("Unable to open 'setup'");
  490.       if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
  491. --- 289,293 ----
  492.       close (id);
  493.       
  494. !     if ((id=open(setup_name,O_RDONLY,0))<0)
  495.           die("Unable to open 'setup'");
  496.       if (read(id,buf,MINIX_HEADER) != MINIX_HEADER)
  497. ***************
  498. *** 185,189 ****
  499.       }
  500.       
  501. !     if ((id=open(argv[3],O_RDONLY,0))<0)
  502.           die("Unable to open 'system'");
  503.       if (read(id,buf,GCC_HEADER) != GCC_HEADER)
  504. --- 326,330 ----
  505.       }
  506.       
  507. !     if ((id=open(zImage_name,O_RDONLY,0))<0)
  508.           die("Unable to open 'system'");
  509.       if (read(id,buf,GCC_HEADER) != GCC_HEADER)
  510. ***************
  511. *** 200,203 ****
  512. --- 341,345 ----
  513.       if (sys_size > SYS_SIZE)
  514.           die("System is too big");
  515. +     total_length = sz;
  516.       while (sz > 0) {
  517.           int l, n;
  518. ***************
  519. *** 208,212 ****
  520.           if ((n=read(id, buf, l)) != l) {
  521.               if (n == -1) 
  522. !                 perror(argv[1]);
  523.               else
  524.                   fprintf(stderr, "Unexpected EOF\n");
  525. --- 350,354 ----
  526.           if ((n=read(id, buf, l)) != l) {
  527.               if (n == -1) 
  528. !                 perror(zImage_name);
  529.               else
  530.                   fprintf(stderr, "Unexpected EOF\n");
  531. ***************
  532. *** 217,225 ****
  533.       }
  534.       close(id);
  535. !     if (lseek(1,500,0) == 500) {
  536. !         buf[0] = (sys_size & 0xff);
  537. !         buf[1] = ((sys_size >> 8) & 0xff);
  538. !         write(1, buf, 2);
  539.       }
  540.       return(0);
  541.   }
  542. --- 359,422 ----
  543.       }
  544.       close(id);
  545. !     lh.syssize = intel_short(sys_size);
  546. !     if (is_netBoot) {
  547. !         if ((id = open(unc_image_name,O_RDONLY,0))<0)
  548. !             die("Unable to open 'uncompressed system'");
  549. !         if (read(id,buf,GCC_HEADER) != GCC_HEADER)
  550. !             die("Unable to read header of 'uncompressed system'");
  551. !         if (N_MAGIC(*ex) != ZMAGIC)
  552. !             die("Non-GCC header of 'uncompressed system'");
  553. !         fprintf(stderr,"Real System is %d kB (%d kB code, %d kB data and %d kB bss)\n",
  554. !             (ex->a_text+ex->a_data+ex->a_bss)/1024,
  555. !             ex->a_text /1024,
  556. !             ex->a_data /1024,
  557. !             ex->a_bss  /1024);
  558. !         fluffed_length = ex->a_text+ex->a_data+ex->a_bss;
  559. !         close(id);
  560. !         if ((id=open(ram_name, O_RDONLY, 0))<0)
  561. !             die("Unable to open 'ramdisk'");
  562. !         iramsize = 0;
  563. !         while((i = read(id, buf, sizeof(buf))) > 0) {
  564. !             if (write(1, buf, i) != i)
  565. !                 die("failed to write ramdisk");
  566. !             iramsize += i;
  567. !         }
  568. !         close(id);
  569. !         ramsize = (iramsize + 1023) / 1024;
  570. !         ramstart = 1024 + (fluffed_length + 4095) / 1024;
  571. !         if (ramsize) {
  572. !             lh.ram_size     = (unsigned short) (ramsize);
  573. !             lh.ramdsk_start = (unsigned short) (ramstart);
  574. !         }
  575. !         lh.magic        = intel_long(0x1b031336);
  576. !         lh.hlengthflags = intel_long(LENGTH_FIELD);
  577. !         lh.locn         = intel_long(INITSEG<<16);    /*  es:bx */
  578. !         lh.execute      = intel_long(SETUPSEG<<16);    /*  cs:ip */
  579. !         lh.lr_setup.rlength = intel_long(LENGTH_FIELD);
  580. !         lh.lr_setup.address = intel_long(SETUPSEG<<4);
  581. !         lh.lr_setup.ilength = intel_long(SETUP_SECTS * 512);
  582. !         lh.lr_setup.mlength = intel_long(SETUP_SECTS * 512);
  583. !         lh.lr_kernel.rlength = intel_long(LENGTH_FIELD | (ramsize ? 0 : FLAG_EOF));
  584. !         lh.lr_kernel.address = intel_long(SYSSEG<<4);
  585. !         lh.lr_kernel.ilength = intel_long(total_length);
  586. !         lh.lr_kernel.mlength = intel_long(total_length);
  587. !         if (ramsize) {
  588. !             lh.lr_ramdisk.rlength = intel_long(LENGTH_FIELD | FLAG_EOF);
  589. !             lh.lr_ramdisk.address = intel_long(ramstart * 1024);
  590. !             lh.lr_ramdisk.ilength = intel_long(iramsize);
  591. !             lh.lr_ramdisk.mlength = intel_long(ramsize *  1024);
  592. !         }
  593.       }
  594. +     if (lseek(1,0,0) != 0) 
  595. +         die("Can't seek to beginning of redirected output");
  596. +     i=write(1,&lh,512);
  597. +     if (i!=512)
  598. +         die("Rewrite boot sector failed");
  599.       return(0);
  600.   }
  601.